//treeSelect组件
layui.define(['layer', 'ztree'], function (exports) {
    var _MOD = 'treeselect',
        layer = layui.layer,
        $ = layui.jquery;
    var TreeSelect = function () {
        this.v = '1.0.0';
    };
    /**
     * 渲染treeSelect
     */
    TreeSelect.prototype.render = function (options, setting) {
        var that = this;
        // 设置可参考ztree.js配置 URL:http://www.treejs.cn/v3/api.php
        var setting = $.extend({}, {
                check: {
                    enable: true,
                    chkboxType: {
                        "Y": "",
                        "N": ""
                    }
                },
                view: {
                    dblClickExpand: false
                },
                data: {
                    simpleData: {
                        enable: true
                    }
                },
                callback: {
                    // ztree 点击前发生
                    beforeClick: function (treeId, treeNode) {
                        var zTree = $.fn.zTree.getZTreeObj(treeId);
                        zTree.checkNode(treeNode, !treeNode.checked, null, true);
                    },
                    // ztree 点击时发生
                    onClick: onClick,
                    onCheck: onClick
                }
            }, setting
        );
        // 获取当前时间戳
        var times = new Date().getTime();
        var eId = 'content' + times;
        var treeDOMId = 'treeDemo' + times;
        // 创建DOM
        $(options.elem)
            .parent()
            .append('<div class="ztree-input" id="' + options.elem.substr(1) + '"></div>')
            .append(['<div id="' + eId + '" class="ztree-content layui-anim layui-anim-upbit">',
                '<ul id="treeDemo' + times + '" class="ztree"></ul>',
                '</div>'
            ].join(''))
            .children('input.layui-input').removeAttr('id');
        // 初始化zTree
        var zTree = $.fn.zTree.init($('#' + treeDOMId), setting, options.data);
        // 获取所有节点
        var nodes = zTree.getNodes();
        // 获取初始值
        var vals = $(options.elem).parent().children('input.layui-input').val();
        if ($.trim(vals).length > 0) {
            initNode(nodes);
        }

        // 初始化数据
        function initNode(nodes) {
            for (var i = 0, l = nodes.length; i < l; i++) {
                var node = nodes[i];
                if (findArray(vals.split(','), node.id) !== -1) {
                    zTree.checkNode(node, true, false);
                    $(options.elem).append([
                        '<a href="javascript:;">',
                        node.name,
                        ' <i class="layui-icon" data-action="close" data-tid="' + node.tId + '" data-id="' + node.id + '">&#x1006;</i>',
                        '</a>'
                    ].join(''));
                    _bindCloseEvent();
                }
                if (node.children !== null && node.children !== undefined && node.children.length > 0) {
                    // 递归调用
                    initNode(node.children);
                }
            }
        };

        //点击事件的处理
        function onClick(e, treeId, treeNode) {
            var zTree = $.fn.zTree.getZTreeObj(treeId),
                nodes = zTree.getCheckedNodes(true), //获取选中的节点
                valIds = [],
                arr = [];
            for (var i = 0, l = nodes.length; i < l; i++) {
                valIds.push(nodes[i].id);
                arr.push({
                    name: nodes[i].name,
                    id: nodes[i].id,
                    tid: nodes[i].tId
                });
            }
            _div = $(options.elem);
            var _htm = [];
            layui.each(arr, function (index, item) {
                _htm.push([
                    '<a href="javascript:;">',
                    item.name,
                    ' <i class="layui-icon" data-action="close" data-tid="' + item.tid + '" data-id="' + item.id + '">&#x1006;</i>',
                    '</a>'
                ].join(''));
            });
            _div.html(_htm.join(''));
            //给input 赋值
            var _input = _div.siblings('input.layui-input');
            _input.attr("value", valIds.join(','));
            _bindCloseEvent();
        }

        // input 框点击事件
        $(options.elem).off('click').on('click', function () {
            $("#" + eId).show();
            $(document).off('mousedown').on("mousedown", function (event) {
                if (!('#' + event.target.id == options.elem || event.target.id == eId || $(event.target).parents('#' + eId).length > 0)) {
                    // 隐藏ztree
                    $("#" + eId).fadeOut('fast');
                }
            });
        });

        /**
         * 绑定删除按钮事件
         */
        function _bindCloseEvent() {
            var _div = $(options.elem),
                _input = _div.siblings('input.layui-input');
            _div.find('i[data-action=close]').off('click').on('click', function (e) {
                layui.stope(e);
                // 获取id
                var id = $(this).data('id');
                // 获取tid
                var tid = $(this).data('tid');
                // 处理节点显示
                var node = zTree.getNodeByTId(tid);
                // 将对应的ztree节点的check取消选中
                zTree.checkNode(node, false, false);
                // 处理input 值
                var inputs = _input.val().split(',');
                // 移除当前所选值Id
                inputs.remove(id);
                // 重新辅助
                _input.attr('value', inputs.join(','));
                // 移除截元素
                $(this).parent().remove();
            });
        }

        return that;
    };


// Array 扩展
    Array.prototype.indexOf = function (val) {
        for (var i = 0; i < this.length; i++) {
            if (this[i] == val) return i;
        }
        return -1;
    };
// 移除指定值
    Array.prototype.remove = function (val) {
        var index = this.indexOf(val);
        if (index > -1) {
            this.splice(index, 1);
        }
    };

    /**
     *
     * 查找数组，返回匹配到的第一个index
     *
     * @param array 被查找的数组
     * @param feature 查找特征 或者为一个具体值，用于匹配数组遍历的值，或者为一个对象，表明所有希望被匹配的key-value
     * @param or boolean 希望命中feature全部特征或者只需命中一个特征，默认true
     *
     * @return 数组下标  查找不到返回-1
     */
    function findArray(array, feature, all) {
        all = all || true;
        for (var index in array) {
            var cur = array[index];
            if (feature instanceof Object) {
                var allRight = true;
                for (var key in feature) {
                    var value = feature[key];
                    if (cur[key] == value && !all) return index;
                    if (all && cur[key] != value) {
                        allRight = false;
                        break;
                    }
                }
                if (allRight) return index;
            } else {
                if (cur == feature) {
                    return index;
                }
            }
        }
        return -1;
    };
// 导出组件
    exports(_MOD, new TreeSelect());
})
;